#ifndef _OS_TASK_EVENT_H_
#define _OS_TASK_EVENT_H_

#include "stm32l4xx_hal.h"

// 组件任务事件组队列大小
#define TASK_EVENT_SIZE (EVENT_MAX)
// 任务ID异常
#define TASK_EVENT_ID_ERR (0xFF)
// 任务ID已分配最大
#define TASK_EVENT_ID_MAX (TASK_EVENT_SIZE)
// 任务回调数组最大大小
#define TASK_EVENT_CALLBACK_SIZE (5)
// 任务回调数组异常
#define TASK_EVENT_CALLBACK_ID_ERR (TASK_EVENT_CALLBACK_SIZE)

// 任务事件状态
enum os_event_state {
    // 默认值
    EVENT_STATUS_INIT,
    // 取消订阅
    EVENT_STATUS_UNSUBSCRIBED,
    // 已订阅
    EVENT_STATUS_SUBSCRIBED,
    // 已发布
    EVENT_STATUS_PUBLISH,
    // 事件正在执行
    EVENT_STATUS_EXECUTE
};

// 任务事件结果
enum os_event_result {
    // 错误
    RESULT_ERR,
    // 正常
    RESULT_OK,
    // 事件数量已分配最大
    RESULT_EVENT_MAXIMUM,
    // 事件回调函数为空
    RESULT_EVENT_CALLBACK_FUNC_NULL,
    // 事件回调函数没找到
    RESULT_EVENT_CALLBACK_NOT_FOUND,
    // 事件回调函数个数已分配最大
    RESULT_EVENT_CALLBACK_MAXIMUM,
    // 事件回调函数重复赋值
    RESULT_EVENT_CALLBACK_REPEAT,
    // 事件ID错误
    RESULT_EVENT_ID_ERR,
    // 事件ID没找到
    RESULT_EVENT_ID_NOT_SUBSCRIBED
};
// 任务事件
enum os_task_event {
    // 无事件
    EVENT_NONE
    // 数据准备完成
    EVENT_COLLECT_FINISH,
    // 算法分析完成
    EVENT_ALG_ANALYSIS_FINISH,
    // 以下事件在高功耗任务期间不执行，直到进入低功耗任务再执行
    // 接收到串口HART数据
    EVENT_UART_HART,

    EVENT_MAX
};

// 事件过滤器
enum os_event_filter {
    // 禁用事件过滤
    EVENT_FILTER_DISABLE,
    // 启用事件过滤
    EVENT_FILTER_ENABLE
};

// 任务事件属性
typedef int8_t (*task_event_func_t)(uint8_t *param_8u, uint16_t *param_16u);

// 任务事件属性结构体
struct os_event_attr {
    // 任务事件ID
    enum os_task_event event_id;
    // 任务状态
    uint8_t event_status;
    // 回调函数个数
    uint8_t event_callback_count;
    // 任务参数
    uint8_t *param_8u;
    // 任务参数
    uint16_t *param_16u;
    // 回调函数列表
    task_event_func_t event_callbacks[TASK_EVENT_CALLBACK_SIZE];
};

// 事件管理器结构体
struct os_event_manager {
    // 事件数量
    uint8_t event_count;
    // 发布事件数量
    uint8_t event_publish_count;
    // 事件过滤器
    enum os_event_filter event_filter_enable;
    // 事件组组
    struct os_event_attr events[TASK_EVENT_SIZE];
};
// 事件使用计数
uint8_t event_used_count(void);
// 订阅任务事件
enum os_event_result task_event_subscribe(enum os_task_event event_id, task_event_func_t callback_func);
// 发布任务事件
enum os_event_result task_event_publish(enum os_task_event event_id, uint8_t *param_8u, uint16_t *param_16u);
// 取消订阅
enum os_event_result task_event_unsubscribe(enum os_task_event event_id, task_event_func_t callback_func);
// 触发循环
void task_event_trigger_loop(void);
// 启用事件过滤
void task_event_filter_enable(enum os_event_filter filter);
// 事件管理器结构体
extern struct os_event_manager os_event;

#endif // _OS_TASK_EVENT_H_